欢迎转载,转载请标明出处.
英文原文文档地址: Litho-doc
进阶指引
TreeProp
@TreeProp是那些自动并且静默的从父Component传递给子Component的prop.
TreeProp非常方便,它能够在一个布局树上分享上下文数据或者工具而又不需要显式的传递prop给每一个层级结构上的Component.
预加载器就是一个很好的例子,它能够在渲染图片之前从网络上预抓取图片.由于图片在程序中非常常见,预加载器也被广泛的应用.我们可以不用@Prop把预加载器传递给整个布局树,而是把预加载器的实现定义给那些需要使用它的Component.
声明一个TreeProp
每一个TreeProp都是在一个被注释为@OnCreateTreeProp的方法中被声明和定义的.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| @LayoutSpec public class ParentComponentSpec { @OnCreateTreeProp static Prefetcher onCreatePrefetcher( ComponentContext c, @Prop Prefetcher prefetcher) { return prefetcher; } @OnCreateLayout static ComponentLayout onCreateLayout( ComponentContext c, @Prop Uri imageUri) { return ChildComponent.create(c) .imageUri(imageUri) .buildWithLayout(); } }
|
你只能为任何给定类型声明一个@TreeProp.如果一个ParentComponent的子类也定义了一个Prefetcher类型的@TreeProp,它将会覆写它的所有子类的相应的@TreeProp值(但是不包括它自己的值).
使用一个TreeProp
孩子component可以使用@TreeProp注释来声明一个和父亲Component的@OnCreateTreeProp方法中同样类型的参数的方式来访问TreeProp的值.
1 2 3 4 5 6 7 8 9 10 11 12 13
| @LayoutSpec class ChildComponentSpec { @OnCreateLayout static ComponentLayout onCreateLayout( ComponentContext context, @TreeProp Prefetcher prefetcher, @Prop Uri imageUri) { if (prefetcher != null) { prefetcher.prefetch(imageUri); } ... } }
|